TI-RTOS提供了一些驅動,
這篇要來介紹的是TI-RTOS I2C的驅動的程式碼,
這支程式把暫存器的操作和I2C的基本運作進行了包裝,
最後我們只需要呼叫這幾個函式就可以完成I2C的讀寫,
直接來看bsp_i2c.h就好,bsp_i2c.c 的部分就跳過了
// 這兩個定義的功能我還不清楚
// 從範例程式看來只有用到第一個 BSP_I2C_INTERFACE_0
#define BSP_I2C_INTERFACE_0 0
#define BSP_I2C_INTERFACE_1 1
// 這個函式通常在系統初始化的時候就會先做,
// 這個函式內部除了會初始化I2C的暫存器狀態和參數配置之外,
// 還會建立一個號誌(Semaphore),
// 用來避免多執行緒(Thread)或任務(Task)同時呼叫bsp_i2c的讀寫,
// 所造成的資源衝突。
void bspI2cInit(void);
// 透過I2C 讀取外部裝置的資料並存入指定位址
bool bspI2cRead(uint8_t *pBuf, uint8_t len);
// 透過I2C 把指定位址的資料發送至外部裝置
bool bspI2cWrite(uint8_t *pBuf, uint8_t len);
// 同上,但長度只有一個位元組
bool bspI2cWriteSingle(uint8_t data);
// 先寫出指定長度的資料,再讀取指定長度的資料到指定的位址
// 通常I2C 裝置都要先指定從機位址,
// 所以常直接呼叫這個函式來進行讀取外部I2C 裝置的資料
bool bspI2cWriteRead(uint8_t *wdata, uint8_t wlen, uint8_t *rdata, uint8_t rlen);
// 在進行I2C讀寫前,必須要先呼叫這個函式
// 這個函式包含號誌的控制(Semaphore_pend())
void bspI2cAcquire(uint8_t interface, uint8_t slaveAddress);
// 在結束I2C 的讀寫後,必須呼叫這個函式來釋放號誌(Semaphore_post())
void bspI2cRelease(void);
最後來看一下使用bsp_i2c驅動的範例- sensor_bmp280.c,
這同樣在TI 範例程式中找到的,
void sensorBmp280Init(void)
{
uint8_t val;
// 1. 帶入從機的位址,並嘗試取得使用I2C 的權限,取得權限後,可避免其他執行緒也進行I2C 的操作而造成當機
bspI2cAcquire(BSP_I2C_INTERFACE_0,SENSOR_I2C_ADDRESS);
// 2. 讀取從機上的資料,
// 第一個參數是該晶片的暫存器位址,(這要看從機晶片的規格書)
// 第二個參數是存放資料的位址
// 第三個參數是讀取資料的長度
// Read and store calibration data
sensorReadReg( ADDR_CALIB, calData, CALIB_DATA_SIZE);
// 3. 寫資料到從機上
// 第一個參數是該晶片的暫存器位址,(這要看從機晶片的規格書)
// 第二個參數是準備寫出去的資料的位址
// 第三個參數是讀取資料的長度
// Reset the sensor
val = VAL_RESET_EXECUTE;
sensorWriteReg(ADDR_RESET, &val, sizeof(val));
// 3. 操作結束後,釋放I2C 的權限
bspI2cRelease();
}
使用別人包好的驅動就是那麼簡單,
只要幾個步驟即可完成I2C 的讀寫,
今天分享就到這,大家明天見。